﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Financial_Assistant
{
    /// <summary>
    /// Логика взаимодействия для CategoryWindow.xaml
    /// </summary>
    /// 
    public class CategoryProfit
    {
        public string ProfitID { get; set; }
        public string ProfitCategName { get; set; }
    }

    public class CategoryConsume
    {
        public string ConsumeCategName { get; set; }
        public string ConsumeID { get; set; }
    }

    public partial class CategoryWindow : Window
    {
        private string _connectionString =
                @"Data Source = CHRISTINABEIM\SQLEXPRESS; Initial Catalog=Financial_Assistant; Trusted_Connection=True;"; //( ip-сервера, имя БД, разрешение соединения)
        private string UserID = String.Empty;
        public ObservableCollection<CategoryProfit> ProfitCateg { get; private set; } // коллекция для привязки данных к дата_гриду
        public ObservableCollection<CategoryConsume> ConsumeCateg { get; private set; } // коллекция для привязки данных к дата_гриду

        public CategoryWindow(string userID)
        {
            InitializeComponent();
            UserID = userID;

            //Создаем и привязываем коллекции к дата гридам
            ProfitCateg = new ObservableCollection<CategoryProfit>();
            ConsumeCateg = new ObservableCollection<CategoryConsume>();

            ProfitDataGrid.CanUserAddRows = false;
            ProfitDataGrid.CanUserDeleteRows = false;
            ProfitDataGrid.IsReadOnly = true;
            ProfitDataGrid.ItemsSource = ProfitCateg; // задаем источник данных для грида

            ConsumeDataGrid.CanUserAddRows = false;
            ConsumeDataGrid.CanUserDeleteRows = false;
            ConsumeDataGrid.IsReadOnly = true;
            ConsumeDataGrid.ItemsSource = ConsumeCateg; // задаем источник данных для грида

            //обновляем гриды
            consumeTabItemGotFocus();
            profitTabItemGotFocus();
        }

        private void AddConsumeBut_Click(object sender, RoutedEventArgs e)
        {
            CategoryCard myWin = new CategoryCard(UserID, String.Empty, String.Empty, MyBoolAction.Consume, true);
            myWin.Owner = this;
            myWin.ShowDialog();
            consumeTabItemGotFocus();
        }

        private void ChangeConsumeBut_Click(object sender, RoutedEventArgs e)
        {
            if (this.ConsumeDataGrid.SelectedItem != null)
            {
                CategoryCard myWin = new CategoryCard(UserID, ConsumeCateg[ConsumeDataGrid.SelectedIndex].ConsumeID, ConsumeCateg[ConsumeDataGrid.SelectedIndex].ConsumeCategName, MyBoolAction.Consume, false);
                myWin.Owner = this;
                myWin.ShowDialog();
                consumeTabItemGotFocus();
            }
            else
            {
                MessageBox.Show("Выберите данные для изменения");
            }
        }

        private void DeleteConsumeBut_Click(object sender, RoutedEventArgs e)
        {
            //НАСТРОЕНО КАСКАДНОЕ УДАЛЕНИЕ!!!!
            //Находим выбранную категорию и запрашиваем подтверждение удаления
            if (this.ConsumeDataGrid.SelectedItem != null)
            {
                //запросить подтверждение удаления
                string question = "Вы действительно хотите удалить данную категорию?";
                MessageBoxResult resultBox = MessageBox.Show(question, "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question);

                if (resultBox == MessageBoxResult.Yes)
                {
                    //пользователь подтведил удаление
                    try
                    {
                        SqlConnection connection = new SqlConnection(_connectionString);
                        StringBuilder query = new StringBuilder();

                        query.Append("DELETE [Используемые категории] FROM [Используемые категории] where  [ID используемой категории] = '");
                        query.Append(ConsumeCateg[ConsumeDataGrid.SelectedIndex].ConsumeID + "'");

                        connection.Open(); // открыть считывание
                        SqlCommand command = new SqlCommand(query.ToString(), connection);
                        SqlDataReader reader = command.ExecuteReader();
                        connection.Close();
                        reader.Dispose();
                        command.Dispose();
                        MessageBox.Show("Категория удалена");

                        //обновляем грид, но не вызовом заново считывания из базы и переписывания коллекции, а так:
                        ConsumeCateg.Remove(ConsumeCateg[ConsumeDataGrid.SelectedIndex]);
                        ConsumeDataGrid.Items.Refresh();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message);
                    }
                }
            }
            else
            {
                MessageBox.Show("Выберите данные для удаления");
            }
        }

        private void AddProfBut_Click(object sender, RoutedEventArgs e)
        {
            CategoryCard myWin = new CategoryCard(UserID, String.Empty, String.Empty, MyBoolAction.Profit, true);
            myWin.Owner = this;
            myWin.ShowDialog();
            profitTabItemGotFocus();
        }

        private void ChangeProfitBut_Click(object sender, RoutedEventArgs e)
        {
            if (this.ProfitDataGrid.SelectedItem != null)
            {
                CategoryCard myWin = new CategoryCard(UserID, ProfitCateg[ProfitDataGrid.SelectedIndex].ProfitID, ProfitCateg[ProfitDataGrid.SelectedIndex].ProfitCategName, MyBoolAction.Profit, false);
                myWin.Owner = this;
                myWin.ShowDialog();
                profitTabItemGotFocus();
            }
            else
            {
                MessageBox.Show("Выберите данные для изменения");
            }
        }

        private void DeleteProfitBut_Click(object sender, RoutedEventArgs e)
        {
            //НАСТРОЕНО КАСКАДНОЕ УДАЛЕНИЕ!!!!
            //Находим выбранную категорию и запрашиваем подтверждение удаления
            if (this.ProfitDataGrid.SelectedItem != null)
            {
                //запросить подтверждение удаления
                string question = "Вы действительно хотите удалить данную категорию?";
                MessageBoxResult resultBox = MessageBox.Show(question, "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question);

                if (resultBox == MessageBoxResult.Yes)
                {
                    //пользователь подтведил удаление
                    try
                    {
                        SqlConnection connection = new SqlConnection(_connectionString);
                        StringBuilder query = new StringBuilder();

                        query.Append("DELETE [Используемые категории] FROM [Используемые категории] where [ID используемой категории] = '");
                        query.Append(ProfitCateg[ProfitDataGrid.SelectedIndex].ProfitID + "'");

                        connection.Open(); // открыть считывание
                        SqlCommand command = new SqlCommand(query.ToString(), connection);
                        SqlDataReader reader = command.ExecuteReader();
                        connection.Close();
                        reader.Dispose();
                        command.Dispose();
                        MessageBox.Show("Категория удалена");

                        //обновляем грид, но не вызовом заново считывания из базы и переписывания коллекции, а так:
                        ProfitCateg.Remove(ProfitCateg[ProfitDataGrid.SelectedIndex]);
                        ProfitDataGrid.Items.Refresh();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message);
                    }
                }
            }
            else
            {
                MessageBox.Show("Выберите данные для удаления");
            }
        }

        //При активации окна добавляем все данные в коллекцию
        private void consumeTabItemGotFocus()
        {
            ConsumeCateg.Clear();//очищаем коллекцию

            try
            {
                SqlConnection connection = new SqlConnection(_connectionString);
                StringBuilder query = new StringBuilder();
                connection.Open(); // открыть считывание

                query.Append("SELECT [ID используемой категории], Наименование FROM [Используемые категории]");
                query.Append("where [Используемые категории].[ID пользователя] = '");
                query.Append(UserID + "' and [Используемые категории].Вид = 'false'");
                //false - расход

                SqlCommand command = new SqlCommand(query.ToString(), connection);
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    CategoryConsume data = new CategoryConsume();

                    data.ConsumeID = reader[0].ToString();
                    data.ConsumeCategName = reader[1].ToString();

                    ConsumeCateg.Add(data);
                }
                reader.Close();
                command.Dispose();

                connection.Dispose();
            }
            catch (Exception em)
            {
                MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + em.Message);
            }
        }
        private void profitTabItemGotFocus()
        {
            ProfitCateg.Clear(); //очищаем коллекцию

            try
            {
                SqlConnection connection = new SqlConnection(_connectionString);
                StringBuilder query = new StringBuilder();
                connection.Open(); // открыть считывание

                query.Append("SELECT [ID используемой категории], Наименование FROM [Используемые категории]");
                query.Append("where [Используемые категории].[ID пользователя] = '");
                query.Append(UserID + "' and [Используемые категории].Вид = 'true'");
                //true - доход

                SqlCommand command = new SqlCommand(query.ToString(), connection);

                SqlDataReader reader = command.ExecuteReader();
                string results = String.Empty;

                while (reader.Read())
                {
                    CategoryProfit data = new CategoryProfit();

                    data.ProfitID = reader[0].ToString();
                    data.ProfitCategName = reader[1].ToString();

                    ProfitCateg.Add(data);
                }
                reader.Close();
                command.Dispose();
                connection.Dispose();
            }
            catch (Exception em)
            {
                MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + em.Message);
            }
        }

        private void CloseBut_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

    }
}
